package com.haiqiu.tools.auth.inspect.impl;

import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.haiqiu.tools.auth.config.TokenConfig;
import com.haiqiu.tools.auth.inspect.TokenService;
import com.haiqiu.tools.auth.utils.EncryptUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Service;

import java.util.Map;

/**
 * @author HaiQiu
 * @since 2023/3/16
 */
@Service
@Order(10)
public class DefaultTokenServiceImpl<T> implements TokenService<T> {

    @Autowired
    private TokenConfig tokenConfig;

    /**
     * 创建token
     *
     * @param userId 用户ID
     * @return 返回创建的token
     */
    @Override
    public String createToken(Long userId) {
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("userId", userId);
        // 加密数据, 返回密文
        return EncryptUtil.AESencode(jsonObject.toString(), tokenConfig.getSecret());
    }

    /**
     * 创建token
     *
     * @param t 泛型数据，可以为一个用户信息的实体，包含用户id，用户名等信息
     * @return 返回创建的token
     */
    @Override
    public String createToken(T t) {
        String userDetail = JSON.toJSONString(t);
        // 加密数据, 返回密文
        return EncryptUtil.AESencode(userDetail, tokenConfig.getSecret());
    }

    /**
     * 创建token
     * @param maps 数据，可以为一个用户信息的，包含用户id，用户名等信息
     * @return 返回创建的token
     */
    @Override
    public String createToken(Map<String, Object> maps) {
        String userDetail = JSON.toJSONString(maps);
        // 加密数据, 返回密文
        return EncryptUtil.AESencode(userDetail, tokenConfig.getSecret());
    }

    /**
     * 根据token获取用户ID
     *
     * @param token token
     * @return 用户ID
     */
    @Override
    public Long getUserId(String token) {
        String json = EncryptUtil.AESdecode(token,tokenConfig.getSecret());
        Object userId = JSON.parseObject(json).get("userId");
        if (userId instanceof Long) {
            return Long.parseLong(userId.toString());
        }
        return null;
    }


    /**
     * 获取用户信息
     *
     * @param token 用户token
     * @param t     转换的类
     * @return 转换用户的信息
     */
    @Override
    public T getUserDetail(String token, Class<T> t) {
        // 解密数据, 返回明文
        String json = EncryptUtil.AESdecode(token, tokenConfig.getSecret());
        T data = JSON.parseObject(json, t);
        return data;
    }

    @Override
    public boolean checkToken(String token) {
        return false;
    }
}
